#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
测试JavaScript对象字面量解析函数
使用真实的响应文件进行测试
"""

import re
import ast
import json

def parse_javascript_object(text):
    """
    解析JavaScript对象字面量格式（非标准JSON）为Python字典
    
    Args:
        text: JavaScript对象字面量格式的字符串
        
    Returns:
        dict: 解析后的字典，如果失败返回None
    """
    try:
        # 清理文本：移除制表符，统一空格
        text = text.replace('\t', ' ')
        
        # 处理HTML实体（如 &#x2F; 转换为 /）
        import html
        # 先保护字符串内的内容
        strings = []
        string_pattern = r'"[^"]*"'
        
        def replace_string(m):
            idx = len(strings)
            strings.append(m.group(0))
            return f'__STRING_{idx}__'
        
        # 临时替换字符串
        text_no_strings = re.sub(string_pattern, replace_string, text)
        
        # 处理HTML实体（在字符串外）
        text_no_strings = html.unescape(text_no_strings)
        
        # 给键名加引号（匹配 word: 模式）
        # 需要更精确的匹配，避免匹配已引用的键和值
        # 匹配模式：单词字符后跟冒号，但前面不能是引号或数字
        text_no_strings = re.sub(r'([a-zA-Z_][a-zA-Z0-9_]*)\s*:', r'"\1":', text_no_strings)
        
        # 恢复字符串
        for idx, string in enumerate(strings):
            text_no_strings = text_no_strings.replace(f'__STRING_{idx}__', string)
        
        # 使用ast.literal_eval解析（Python字典字面量格式）
        return ast.literal_eval(text_no_strings)
    except (ValueError, SyntaxError) as e:
        print(f"解析JavaScript对象失败: {e}")
        # 打印出问题的部分以便调试
        try:
            lines = text_no_strings.split('\n')
            if len(lines) > 15:
                print("问题区域（第16行附近）:")
                for i in range(max(0, 13), min(len(lines), 20)):
                    print(f"  {i+1}: {lines[i]}")
        except:
            pass
        import traceback
        traceback.print_exc()
        return None


def test_parse_file(file_path, description):
    """
    测试解析文件
    
    Args:
        file_path: 文件路径
        description: 描述信息
    """
    print("=" * 80)
    print(f"测试: {description}")
    print(f"文件: {file_path}")
    print("=" * 80)
    
    try:
        # 读取文件内容
        with open(file_path, 'r', encoding='utf-8') as f:
            text = f.read()
        
        print(f"\n原始内容长度: {len(text)} 字符")
        print(f"前100个字符: {text[:100]}")
        print()
        
        # 尝试解析
        print("开始解析...")
        data = parse_javascript_object(text)
        
        if data is None:
            print("❌ 解析失败！")
            return False
        else:
            print("✅ 解析成功！")
            print(f"\n解析后的数据类型: {type(data)}")
            print(f"顶级键数量: {len(data) if isinstance(data, dict) else 'N/A'}")
            
            # 显示一些关键字段
            if isinstance(data, dict):
                print("\n顶级键列表:")
                for i, key in enumerate(list(data.keys())[:10]):
                    print(f"  - {key}")
                if len(data) > 10:
                    print(f"  ... 还有 {len(data) - 10} 个键")
                
                # 检查特定字段
                if 'status' in data:
                    print("\n✅ 找到 'status' 字段")
                    print(f"  status 内容: {data['status']}")
                
                if 'toner_black' in data:
                    print("\n✅ 找到 'toner_black' 字段")
                    print(f"  toner_black 内容: {data['toner_black']}")
            
            print()
            return True
            
    except FileNotFoundError:
        print(f"❌ 文件不存在: {file_path}")
        return False
    except Exception as e:
        print(f"❌ 测试过程中出错: {e}")
        import traceback
        traceback.print_exc()
        return False


if __name__ == "__main__":
    print("JavaScript对象字面量解析函数测试")
    print("=" * 80)
    print()
    
    # 测试文件列表
    test_files = [
        ("docs/需求/home_response.txt", "home.json 响应"),
        ("docs/需求/supplies_response.txt", "supplies.json 响应")
    ]
    
    results = []
    for file_path, description in test_files:
        result = test_parse_file(file_path, description)
        results.append((description, result))
        print()
    
    # 汇总结果
    print("=" * 80)
    print("测试结果汇总:")
    print("=" * 80)
    for description, result in results:
        status = "✅ 通过" if result else "❌ 失败"
        print(f"{status}: {description}")
    
    print()
    all_passed = all(result for _, result in results)
    if all_passed:
        print("🎉 所有测试通过！")
    else:
        print("⚠️  部分测试失败，请检查解析函数")

